Módulo DirectX – Direct3D
Interfaz gráfica para hardware 3D
Permitir gráficos tridimensionales interactivos en aplicaciones de Windows
2 Modos:
Inmediato
API 3D de bajo nivel
Independiente del dispositivo
Programadores experimentados
Retenido
Desarrollo rápidos
Capa superior del inmediato
Módulo DirectX – Direct3D
Conceptos Básicos
Sistemas de coordenadas 3-D
Left-handed (mano izquierda)
Podemos simular el right-handed
Transformaciones 3-D
Traslación
Rotación
Escalado
Polígonos
Normales de cara y vértice
Modos de sombreado
Interpolaciones de triángulos
Módulo DirectX – Direct3D
Conceptos Básicos
Triángulos
Reglas de rasterización de triángulos
Módulo DirectX – Direct3D (Modo Inmediato)
Tipos de Objetos
IDirectDraw
IDirectDrawSurface
IDirect3Ddevice
IDirect3Dmaterial
IDirect3Dviewport
IDirect3Dlight
IDirect3DexecuteBuffer
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMAnimation
Define como será modificada una transformación acorde al valor tiempo
La animación es ajustada mediante el método SetTime
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMAnimationSet
Permite a IDirect3DRMAnimation que haya agrupación
Compartirán el mismo parámetro tiempo
Dim anim As IDirect3DRMAnimationSet
D3DRM.CreateAnimationSet anim
anim.Load App.Path & "anim.x", 0, 0, 0, 0, animframe
anim.SetTime 1
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMDevice
Representa la visualización final del Render creado
Soporta Devices que renderizan directamente a la pantalla, ventana o memoria de vídeo
Dim Device As IDirect3DRMDevice
D3DRM.CreateDeviceFromSurface …
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMFace
Representa un único objeto en un mesh
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMFrame
Posiciona objetos en una escena y define las posiciones y orientaciones de los objetos visuales
Escena: frame que no tiene "padre", define el frame de referencia para todos los demás objetos
Jerarquías y Motion (rotación y velocidad intrínseca)
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMInterpolator
Guarda acciones y las aplica a otros objetos mediante cálculos automáticos
Ej.: Background en el espacio tiempo 0 el color rojo y en el 10 el color verde. Coloreará de forma automática las escenas sucesivas para fundir desde el rojo al verde
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMLight
Define uno de los 5 tipos de luces que son utilizadas para iluminar los objetos visuales de la escena
Ambiente, Point, Spotlight, Directional y Parallel point
La luz va contenida en un frame y consume mucho proceso de CPU
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMMaterial
Define cómo una superficie refleja la luz
IDirect3DRMMesh
Podemos utilizarlo para manipular grupos de caras y vértices
IDirect3DRMMeshBuilder
Nos permite trabajar con vértices y caras individuales de un mesh. Realmente formará un objeto 3D en la escena
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMPickedArray
Identifica un objeto visual que corresponde a un punto 2D determinado
IDirect3DRMPicked2Array
Suele ser utilizado para colisiones entre objetos
IDirect3DRMShadow
Define una sombra emitida por otro
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMObject
Clase base utilizada por todos los demás objetos del modo retenido
IDirect3DRMProgressiveMesh
Permite la carga de objetos 3D mediante pequeñas porciones
IDirect3DRMTexture
Consta de un array rectangular de píxeles coloreados
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMViewport
Define cómo la escena 3D es renderizada en un plano 2D (como una ventana de Windows)
Cámara: renderiza lo que es visible a lo largo del eje Z positivo, con la dirección ascendente representada en el eje Y positivo
Viewing Frustum: cámara en el pico de la pirámide. Serán visibles los objetos entre el front y el back clipping
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMVisual
Representa cualquier cosa que pueda ser renderizada en una escena
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMWrap
Calcula las coordenadas de textura para una cara o mesh.
Tipo
Frame de referencia
Origen
Vector de dirección
Vector de altura
Factores de escalado
Origen para las coordenadas de textura
Módulo DirectX – Direct3D (Modo Retenido)
IDirect3DRMWrap
Tipos
Wrapping Flags
Flat
Cylindrical
Spherical
Chrome
Módulo DirectX Programación Direct3D
Ejemplo 1
Ejemplo 2
Programación Direct3D
Decidir entre Clipper o FullScreen
La programación se basa en frames.
Puede contener uno o más objetos
Cada objeto 3D debe ir enlazado a un frame determinado
Cinco objetos básicos
Device
Viewport
Scene
World
Camera
Programación Direct3D
Inicio del Programa
Option Explicit
Objeto Direct3D M. retenido
Dim D3DRM As IDirect3DRM3
Dim Scene As IDirect3DRMFrame3 Frame de escena
Dim Camera As IDirect3DRMFrame3 Frame de cámara
Dim clipper As IDirectDrawClipper Objeto Clipper
Dim Device As IDirect3DRMDevice3 Objeto Device
Dim Viewport As IDirect3DRMViewPort Objeto Viewport
Dim LightFrame As IDirect3DRMFrame3 Frame de Luz
Dim Light As IDirect3DRMLight Objeto Luz
Dim Globe As IDirect3DRMMeshBuilder3 Mesh (objeto 3D)
Dim globeframe As IDirect3DRMFrame3 Frame del Mesh
Dim salir As Boolean Fin de la aplicación
Programación Direct3D
Inicializar los objetos Direct3D Modo Retenido, Clipper, Viewport y Device. Se crean los frames correspondientes a la escena y la cámara, enlazando el frame cámara a de la escena para que la visualización sea posible
Sub init_clipper()
Creamos el objeto Direct3D Modo Retenido
Direct3DRMCreate D3DRM
Creamos el frame de la escena sin enlazarlo a ningún frame, puesto que será el frame padre
D3DRM.CreateFrame Nothing, Scene
Creamos el frame de cámara enlazándolo directamente al de la escena y lo posicionamos en 0,0,0 de X, Y y Z. Variando estos valores podremos mover la cámara hacia diferentes puntos de vista de la escena que hemos creado.
D3DRM.CreateFrame Scene, Camera
Camera.SetPosition Scene, 0, 0, 0
Creamos el clipper (ventana)
DirectDrawCreateClipper 0&, clipper, Nothing
clipper.SetHWnd 0, Me.hWnd
Creamos el Device y el Viewport. El Device debemos enlazarlo al Clipper para que los gráficos 3D sean volcados en el mismo. En la creación del Viewport es necesario señalar el frame del Device y la cámara que utilicemos.
D3DRM.CreateDeviceFromClipper clipper, ByVal 0&, 320, 200, Device
D3DRM.CreateViewport Device, Camera, 0, 0, 320, 200, Viewport
End Sub
Programación Direct3D
ApplyTexture es un procedimiento encargado de crear el wrapper (envoltura) y la textura que se aplicarán a un objeto determinado. Los parámetros son: Meshbuilder que asigna el objeto que se verá afectado por la textura y StrTextureFileName que pasa el nombre del fichero que contiene la textura a aplicar
Sub ApplyTexture(MeshBuilder As IDirect3DRMMeshBuilder3, ByVal strTextureFileName As String)
Dim Box As D3DRMBOX Volumen del objeto
Dim MaxY As Single Valor máximo
Dim MinY As Single Valor mínimo
Dim Height As Single Valor de alto
Dim Wrap As IDirect3DRMWrap Wrapper
Dim texture As IDirect3DRMTexture Textura
Tomamos el objeto para crear una caja imaginaria que lo cubra
MeshBuilder.GetBox Box
MaxY = Box.Max.Y
MinY = Box.Min.Y
Height = MaxY – MinY
Programación Direct3D
Creamos el wrapper con los valores obtenidos anteriormente
D3DRM.CreateWrap D3DRMWRAP_CYLINDER, Nothing, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, MinY / Height, 1, -1 / Height, Wrap
Aplicamos el wrapper al objeto
Wrap.Apply MeshBuilder
Cargamos la textura con la variable texture
D3DRM.LoadTexture strTextureFileName, texture
MeshBuilder.SetTexture texture
Set texture = Nothing
End Sub
Mediante Form_Keypress detectamos si se ha pulsado una tecla para salir del programa automáticamente
Private Sub Form_KeyPress(KeyAscii As Integer)
salir = True
End Sub
Programación Direct3D
En este procedimiento de formulario iniciamos los valores necesarios pare crear los objetos que conformarán la escena 3D. Además, también gestionamos el bucle principal que permitirá la visualización de la escena en pantalla
Private Sub Form_Load()
Llamamos a init_clipper para crear los frames y el clipper
init_clipper
El método SetBack se aplica al frame Viewport. Se encarga de establecer el espacio en el cual es posible visualizar los objetos. Si un objeto, o parte de él, sobrepasa este valor, no será representado en pantalla
Viewport.SetBack 5000
Asignamos la calidad de Render al dispositivo
Device.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD
Creamos un Frame en la escena para asignar una fuente de luz
D3DRM.CreateFrame Scene, LightFrame
Creamos un objeto de luz tipo direccional
D3DRM.CreateLightRGB D3DRMLIGHT_DIRECTIONAL, 0.8, 0.8, 0.8, Light
Asignamos el objeto al frame anterior
LightFrame.AddLight Light
Programación Direct3D
Dim light2 As IDirect3DRMLight Objeto luz ambiente
Es necesario crear una luz de tipo ambiente para definir la claridad por defecto que ofrecerá el Render. Sin luz ambiente no lograremos visualizar bien la escena
D3DRM.CreateLightRGB D3DRMLIGHT_AMBIENT, 0.4, 0.4, 0.4, light2
Aplicamos la luz en la escena
Scene.AddLight light2
Posicionamos la luz direccional en la escena
LightFrame.SetPosition Scene, 0, 0, 0
Posicionamos la cámara para ajustar el punto de vista
Camera.SetPosition Scene, 0, 0, 0
Camera.SetOrientation Scene, 0, 0, 1, 0, 1, 0
Creamos el objeto visual (Esfera) y su frame correspondiente
D3DRM.CreateFrame Scene, globeframe
D3DRM.CreateMeshBuilder Globe
Mediante el método Load asignamos el path que contiene el objeto
Globe.Load App.Path & "globe.x", 0, D3DRMLOAD_FROMFILE, 0, 0
Establecemos la calidad que tendrá el objeto de cara al Render
Globe.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID Or D3DRMSHADE_GOURAUD
Programación Direct3D
Dependiendo del punto de vista del observador, hay veces en que las texturas de los objetos parecen descolocarse u ofrecen una representación visual muy distinta a la que deberían tener en un principio. Mediante la corrección de perspectiva se soluciona este pequeño problema. Para ello, hay que establecer en true el método SetPerspective que apliquemos al objeto
Globe.SetPerspective 1
Asignamos el objeto a su frame y establecemos sus posiciones en la escena
globeframe.AddVisual Globe
globeframe.SetPosition Scene, 0, 0, 5
globeframe.SetOrientation Scene, 0, 0, 1, 0, 1, 0
Ponemos una rotación al objeto para animarlo constantemente
globeframe.SetRotation Scene, 1, 1, 1, 0.17
Le asignamos la textura
ApplyTexture Globe, App.Path & "fire.bmp"
Vaciamos los objetos que representan las Fuentes de luz
Set LightFrame = Nothing
Set Light = Nothing
Programación Direct3D
Bucle principal
While salir = False
Dibuja en pantalla el render obtenido
redraw_clipper
DoEvents
Wend
Descarga el formulario cuando se acabe la aplicación
vacia_clipper
Unload Me
End Sub
Descarga los objetos DirectX creados
Sub vacia_clipper()
Set Scene = Nothing
Set Camera = Nothing
Set Viewport = Nothing
Set Device = Nothing
Set D3DRM = Nothing
Set clipper = Nothing
End Sub
Programación Direct3D
Dibuja en pantalla el Render obtenido. Recordemos que el Render se alberga primero en el backbuffer y luego se vuelca automáticamente a la ventana
Public Sub redraw_clipper()
On Error GoTo mi_Error
Aplica las rotaciones y velocidades para todos los frames de la jerarquía
Scene.Move 1
Borra el Viewport con el color actual del background
Viewport.Clear
Renderiza una jerarquía de frames al Viewport utilizado. Sólo serán renderizados aquellos objetos visuales que estén en esa jerarquía de frames
Viewport.Render Scene
Copia la imagen que ha sido renderizada a la pantalla o buffer de destino
Device.Update
Exit Sub
mi_Error:
Resume
End Sub
Página anterior | Volver al principio del trabajo | Página siguiente |